Menu Close

Linux Shell – scp 跨服务器文件传输

1. scp、cp 简介

scp是 secure copy 的缩写, scp 是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。

cp 在本地同一台服务器上目录级进行拷贝。

scp 可以在跨服务器进行文件以及文件夹拷贝传输。

1.1. 标准命令解析:cp

cp [parameter] source_address target_address

parameter:[参数],默认可以不用使用,有特殊要求需要加上,如 -a,-r,-f
- -a 表示将源文件状态、权限等资料都照原装予以复制,并且是递归复制
- -r 表示递归复制,若source_address中含有目录名,则将目录下文件皆依序拷贝至target_address
- -f 表示若target_address已经有同名文件,则先删除在复制
- source_address:[源路径],表示被拷贝的文件路径(绝对路径或相对路径)
- target_address:[目录路径],表示要传输到的目标路径或者指定名(绝对路径或相对路径以及指定文件名)

1.2. 标准命令解析:scp

scp [parameter] source_user@source_ip:/source_address target_user@target_ip:/target_address

parameter:[参数],默认可以不用使用,有特殊要求需要加上
- -1 强制scp命令使用协议ssh1
- -2 强制scp命令使用协议ssh2
- -4 强制scp命令只使用IPv4寻址
- -6 强制scp命令只使用IPv6寻址
- -B 使用批处理模式(传输过程中不询问传输口令或短语)
- -C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
- -p 保留原文件的修改时间,访问时间和访问权限
- -q 不显示传输进度条
- -r 递归复制整个目录
- -v 详细方式显示输出,scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题
- -c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh
- -F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh
- -i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh
- -l limit 限定用户所能使用的带宽,以Kbit/s为单位
- -o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式
- -P port 注意是大写的P, port是指定数据传输用到的端口号
- -S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项
- source_user:[源服务器用户名],表示被传输文件所在服务器用户名
- source_ip:[源服务器IP],表示被传输文件所在服务器IP
- source_address:[源路径],表示被拷贝的文件路径(绝对路径或相对路径)
- target_user:[目标服务器用户名],表示要传输到的目标服务器名
- target_ip:[目标服务器IP],表示要传输到的目标服务器IP
- target_address:[目录路径],表示要传输到的目标路径或者指定名(绝对路径或相对路径以及指定文件名)

2. scp 多场景实例

2.1. 本地传输到远程

# 拷贝本地文件到远程多种方式
scp source_file target_user@target_ip:target_folder 拷贝文件到指定目录
scp source_file target_user@target_ip:target_file 拷贝文件并重命名
scp source_file1 source_file2 target_user@target_ip:target_folder 拷贝多个文件
# 模糊(类似正则匹配)批量拷贝到远程目录
scp source_address/abc* target_user@target_ip:target_folder 批量拷贝source_address目录下文件名以abc开头的文件到远程目录下
# 拷贝本地文件夹以及子文件(即拷贝目录)到远程
scp -r source_folder target_user@target_ip:target_folder 拷贝目录到远程目录下

2.2. 远程传输到本地

# 拷贝远程文件到本地多种方式
scp target_user@target_ip:target_file source_folder 传输远程服务器文件到本地目录下
scp target_user@target_ip:target_file source_file 拷贝远程文件并重命名
scp target_user@target_ip:target_address/\{target_file1, target_file2\} source_file 拷贝远程多个文件到本地
# 模糊(类似正则匹配)批量拷贝远程文件到本地
scp target_user@target_ip:target_address/abc* source_folder 批量拷贝target_address目录下文件名以abc开头的所有文件到本地目录
# 拷贝远程文件夹以及子文件(即拷贝目录)到本地
scp -r target_user@target_ip:target_folder source_folder 拷贝远程文件夹到本地

2.3. 两台远程服务器之间传输

# 在不登录远程服务器A和B的情况下,以本地服务器作为操作桥梁
scp targetA_user@targetA_ip:target_file targetB_user@targetB_ip:targetB_folder
# 其它文件夹传输或者批量多文件传输都与场景1、2类似,注意要输入服务器A和B的对应用户密码。

2.4. 穿过跳板机传输

# 本地穿过跳板机向目标服务器传输文件或者文件夹
scp -o "ProxyJump 跳板机用户名@跳板机IP" source_address/source_file target_user@target_ip:/target_address/target_folder 跨过跳板机本地传文件到目标服务器
scp -o "ProxyJump 跳板机用户名@跳板机IP" source_address/source_folder target_user@target_ip:/target_address/target_folder 跨过跳板机本地传文件将爱到目标服务器
# 其它文件或文件夹批量传输与场景1、2、3都类似,需要注意的是 -o "ProxyJump 跳板机用户名@跳板机IP" 穿过跳板机的作用

示例:

~]# scp -o "ProxyJump root@xxx.xxx.xxx.xxx" expdp_oradata_log.log root@yyy.yyy.yyy.yyy:/OraBak

root@xxx.xxx.xxx.xxx's password:
root@yyy.yyy.yyy.yyy's password:
expdp_oradata_log.log            100%  232KB   1.1MB/s   00:00
Killed by signal 1.

文章转载于:https://zhuanlan.zhihu.com/p/82224226